package bean;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Transient;

@Entity
@Table(name = "Cotizaciones")
public class CotizacionVO implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private int nroCotizacion;
	private Date fechaEmision;
	private Date validoHasta;
	private float descuentoVip;
	private String observaciones;
	private ClienteVO cliente;
	private EstadoVO estado;
	private float subtotal;
	private float subtotalConDesc;
	private float iva;
	private float total;
	private List<ItemCotizacionVO> items = new ArrayList<ItemCotizacionVO>();
	private List<PoliticaBeneficioVO> politicas = new ArrayList<PoliticaBeneficioVO>();
	private CondicionDePagoVO condicionDePago;

	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	public int getNroCotizacion() {
		return nroCotizacion;
	}

	public void setNroCotizacion(int nroCotizacion) {
		this.nroCotizacion = nroCotizacion;
	}

	public Date getFechaEmision() {
		return fechaEmision;
	}

	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;
	}

	public Date getValidoHasta() {
		return validoHasta;
	}

	public void setValidoHasta(Date validoHasta) {
		this.validoHasta = validoHasta;
	}

	public float getDescuentoVip() {
		return descuentoVip;
	}

	public void setDescuentoVip(float descuentoVip) {
		this.descuentoVip = descuentoVip;
	}

	public String getObservaciones() {
		return observaciones;
	}

	public void setObservaciones(String observaciones) {
		this.observaciones = observaciones;
	}

	@ManyToOne(fetch=FetchType.LAZY)
	@JoinColumn(name = "cuitCliente")
	public ClienteVO getCliente() {
		return cliente;
	}

	public void setCliente(ClienteVO cliente) {
		this.cliente = cliente;
	}

	@ManyToOne
	@JoinColumn(name = "nroEstado")
	public EstadoVO getEstado() {
		return estado;
	}

	public void setEstado(EstadoVO estado) {
		this.estado = estado;
	}

	@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name = "nroCotizacion")
	public List<ItemCotizacionVO> getItems() {
		return items;
	}

	public void setItems(List<ItemCotizacionVO> items) {
		this.items = items;
	}

	@ManyToMany(cascade = CascadeType.ALL)
	public List<PoliticaBeneficioVO> getPoliticas() {
		return politicas;
	}

	public void setPoliticas(List<PoliticaBeneficioVO> politicas) {
		this.politicas = politicas;
	}

	@ManyToOne
	@JoinColumn(name = "idCondPago")
	public CondicionDePagoVO getCondicionDePago() {
		return condicionDePago;
	}

	public void setCondicionDePago(CondicionDePagoVO condicionDePago) {
		this.condicionDePago = condicionDePago;
	}
	
	@Transient
	public float getSubtotal() {
		return subtotal;
	}

	public void setSubtotal(float subtotal) {
		this.subtotal = subtotal;
	}
	
	@Transient
	public float getSubtotalConDesc() {
		return subtotalConDesc;
	}

	public void setSubtotalConDesc(float subtotalConDesc) {
		this.subtotalConDesc = subtotalConDesc;
	}

	@Transient
	public float getIva() {
		return iva;
	}

	public void setIva(float iva) {
		this.iva = iva;
	}
	@Transient
	public float getTotal() {
		return total;
	}

	public void setTotal(float total) {
		this.total = total;
	}

	public void agregarItem(RodamientoVO r, int cant, float precio) {

		ItemCotizacionVO i = new ItemCotizacionVO();
		i.setRodamiento(r);
		i.setCantidad(cant);
		i.setPrecio(precio);
		items.add(i);
		
	}

	
	public List<ViewItemCotizacion> itemsToView(){
		int nro = 0;
		List<ViewItemCotizacion> itemsView = new ArrayList<ViewItemCotizacion>();
		for(ItemCotizacionVO iVO : items ){
			nro++;
			iVO.setNroItem(nro);
			itemsView.add(iVO.toView());
		}
		return itemsView;
	}
	
	public ViewCotizacion toView(){
		ViewCotizacion v = new ViewCotizacion();
		v.setEstado(this.estado.getDescripcion());
		v.setNroCotizacion(this.nroCotizacion);
		v.setCuitCliente(this.cliente.getCuit());
		v.setFechaEmision(this.fechaEmision);
		v.setValidoHasta(this.validoHasta);
		v.setDescuentoVip(this.descuentoVip);
		v.setSubTotalCotizacion(this.subtotal);
		v.setSubtotalConDesc(this.subtotalConDesc);
		v.setIva(this.iva);
		v.setTotal(this.total);
		v.setObservaciones(this.observaciones);
		v.setItems(this.itemsToView());
		return v;		
	}
	
	public String toString(){
		return  "nro Cotizacion : "+this.getNroCotizacion()+ "\n"
		      + "cuit cliente : " + this.getCliente().getCuit() ;
		
	}
	
	public double calcularTotal(){
		return this.calcularSubtotalConDesc()+ this.calcularIVA() ;
	}
	public double calcularSubtotal() {
		float total = 0;
		for(ItemCotizacionVO i :items)
			total += i.calcularSubTotal();
		return  total;
	}
		
	public double calcularSubtotalConDesc(){
				
		return this.calcularSubtotal()* (1- this.getDescuentoVip()) ;
		
	}
	
	public double calcularIVA(){
		return this.calcularSubtotalConDesc()* (float)0.21;
	}
	
}
